package br.com.ds3.controller;

import java.util.List;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
import br.com.ds3.annotation.Permission;
import br.com.ds3.annotation.Public;
import br.com.ds3.dao.UsuarioDAO;
import br.com.ds3.model.Perfil;
import br.com.ds3.model.Usuario;
import br.com.ds3.session.UserSession;

@Resource
public class UsuarioController {
	private final Result result;
	private final UsuarioDAO usuarioDAO;
	private final UserSession userSession;

	public UsuarioController(Result result, UsuarioDAO usuarioDAO, UserSession userSession) {
		this.result = result;
		this.usuarioDAO = usuarioDAO;
		this.userSession = userSession;
	}
	
    @Permission(value = { Perfil.ADMINISTRADOR, Perfil.ATENDENTE, Perfil.PARTICIPANTE })
    public void pesquisa(String nome, Long pagina) {
		pagina = pagina == null ? 1L : pagina;
        Long paginas = usuarioDAO.countPaginas(nome);
    	List<Usuario> usuarios = usuarioDAO.pesquisa(nome, pagina);
        
        result.include("nome", nome);
        result.include("pagina", pagina);
        result.include("paginas", paginas);
        result.include("usuarios", usuarios);
    }
    
    @Public
    public void grava(Usuario usuario) {
    	Usuario saveUsuario;
    	
    	if (usuario.getId() != null) {
    		saveUsuario = usuarioDAO.get(usuario.getId());
    	} else {
    		saveUsuario = usuario;
    	}
    	
    	saveUsuario.setNome(usuario.getNome());
    	saveUsuario.setNomeUsuario(usuario.getNomeUsuario());
    	saveUsuario.setEmail(usuario.getEmail());
    	saveUsuario.setCpf(usuario.getCpf());
    	
    	if (usuario.getPerfil() == null) {
    		saveUsuario.setPerfil(Perfil.PARTICIPANTE);
    	} else {
    		saveUsuario.setPerfil(usuario.getPerfil());
    	}

    	usuarioDAO.save(saveUsuario);
    	
    	if (userSession.isLogged() && saveUsuario.getId() != null && usuario.getId().equals(userSession.getUser().getId())) {
    		userSession.setUser(saveUsuario);
    	}
    	
    	result.use(Results.json()).withoutRoot().from(saveUsuario).serialize();
    }
    
    @Public
    public void cadastro(Usuario usuario) {
    	result.include("usuario", usuario);
    }
    
    @Public
    public void inclui(Perfil perfilUsuario) {
    	Usuario usuario = new Usuario();
    	usuario.setPerfil(perfilUsuario);
    	result.forwardTo(this).cadastro(usuario);
    }
    
    @Permission(value = { Perfil.ADMINISTRADOR, Perfil.ATENDENTE })   
    public void altera(Long id) {
    	result.forwardTo(this).cadastro(usuarioDAO.get(id));
    }
    
    @Permission(value = { Perfil.ADMINISTRADOR, Perfil.ATENDENTE })   
    public void exclui(Long id) {    	
    	usuarioDAO.delete(usuarioDAO.get(id));    	
    	result.use(Results.status()).ok();
    }
    
    @Get
    @Public
    public void nomeUsuarioExiste(String nomeUsuario, Long id) {
    	Usuario usuario = usuarioDAO.getByNomeUsuario(nomeUsuario);
    	
    	Long retorno;
    	
    	if (usuario != null && !usuario.getId().equals(id)) {
    		retorno = new Long(1);
    	} else {
    		retorno = new Long(0);
    	}
    	
    	result.use(Results.json()).withoutRoot().from(retorno).serialize();
    }
    
    @Permission(value = { Perfil.ADMINISTRADOR, Perfil.ATENDENTE, Perfil.PARTICIPANTE })   
    public void alterarSenha() {}
    
    @Post
    @Permission(value = { Perfil.ADMINISTRADOR, Perfil.ATENDENTE, Perfil.PARTICIPANTE })   
    public void gravaAlteracaoSenha(String senhaAtual, String novaSenha) {
    	Long retorno;
    	
    	if (userSession.getUser().senhaCorreta(senhaAtual)) {
    		Usuario usuario = userSession.getUser();    		
    		usuario.setSenha(novaSenha);    		
    		usuarioDAO.save(usuario);
    		
    		retorno = new Long(0);
    	} else {
    		retorno = new Long(1);
    	}
    	
    	result.use(Results.json()).withoutRoot().from(retorno).serialize();
    }
}
